#ifndef HASHEXTENSIBLE_H_
#define HASHEXTENSIBLE_H_

#include "RegistroCubeta.h"
#include "Cubeta.h"
#include "Tabla.h"
#include <string>
#include <math.h>
#include <vector>
#include "../Archivos/ArchivoDeEstructurasFijas.h"
#include "../Archivos/ManejadorEstructurasLibres.h"

using namespace std;
using namespace Archivos;

namespace Hash {

class HashExtensible {

private:
	Tabla* tabla;
	int porcentajeMaximoCarga;
	ArchivoDeEstructurasFijas* cubetas;
	ManejadorEstructurasLibres* cubetasLibres;
	int tamanioCubeta;
    int maximoDispersiones;
	int aplicarFuncion(string clave, int tamanioDispersion);
	int sePuedeLiberarLaCubeta(int posicion, int tamanioDispersion);
	void liberarCubeta(Cubeta* cubeta, unsigned int numeroCubeta);
	int getPosicionNuevaCubeta();

	unsigned int guardarNuevaCubeta(Cubeta* cubeta);
	void actualizarCubeta(Cubeta* cubeta, unsigned int numeroCubeta);
	Cubeta* obtenerCubeta(unsigned int numeroCubeta);

	void reDispersar(vector<RegistroCubeta*>* registros, RegistroCubeta* nuevoRegistro);

	int getTamanioCubeta() const;
	int getDispersion();
	void setDispersion();
	Tabla* getTabla();
	void setTabla(Tabla* tabla);
	void insertar(RegistroCubeta* registro);
	RegistroCubeta* buscarRegistro(string clave);

public:
	HashExtensible(string name);
	void insertar(string clave, unsigned int dato);
	bool eliminar(string clave, unsigned int dato);
	bool modificar(string clave, unsigned int datoViejo, unsigned int datoNuevo);
	IRegistroIndice* buscar(string clave);
	bool existe(string);
	void exportarTxt(string nombreTxt);

	virtual ~HashExtensible();
};
} //Fin namespace Hash

#endif /* HASHEXTENSIBLE_H_ */
